package com.company.pangu.aliyun.live.generator;

import com.company.pangu.aliyun.live.constants.LiveConstants;
import lombok.Builder;
import lombok.Data;

import java.io.Serializable;
import java.text.MessageFormat;

/**
 * <p>鉴权串构造器</p >
 * https://help.aliyun.com/document_detail/199349.htm?spm=a2c4g.11186623.0.0.33fe6ec8vrM13r#section-ak5-3ig-mv4
 *
 * @author youyoukele
 * @version 1.0
 * @date 2021/10/28
 */
@Builder
@Data
public class AuthKeyGenerator implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * auth_key=timestamp-rand-uid-md5hash
     */
    private static final String FORMATTER = "{0}-{1}-{2}-{3}";

    /**
     * URL时间戳，是此鉴权URL生效的时间。为Unix时间戳，格林威治时间1970年01月01日00时00分00秒（北京时间1970年01月01日08时00分00秒）起至现在的总秒数。
     */
    private long timestamp;

    /**
     * 随机数，一般为0。
     * 如要确保每次生成的URL不同，建议使用UUID格式，不能包含中划线（-），如：477b3bbc253f467b8def6711128c7bec 。
     */
    private String rand;

    /**
     * 附加参数，暂未使用，一般为0。
     */
    private String uid;

    /**
     * 通过md5算法计算出的验证串。数字和小写英文字母混合0~9、a~z，固定长度32。
     * <p>
     * sstring = "URI-timestamp-rand-uid-PrivateKey"
     * md5hash = md5sum(sstring)
     * <p>
     * URI：用户请求对象相对地址，即原始URL中的/AppName/StreamName，其中StreamName包含扩展名。
     * 生成FLV播放地址时，URI为/AppName/StreamName.flv。
     * 生成HLS播放地址时，URI为/AppName/StreamName.m3u8。
     * 生成FLV转码播放地址时，URI为/AppName/StreamName_ID.flv。
     * 生成HLS转码播放地址时，URI为/AppName/StreamName_ID.m3u8。
     * <p>
     * PrivateKey：控制台配置的主KEY或副KEY，二者皆可。
     * md5sum：表示计算MD5值，请使用开发语言对应的函数。
     */
    private String md5hash;

    public String gen() {
        return MessageFormat.format(AuthKeyGenerator.FORMATTER, String.valueOf(timestamp), rand, uid, md5hash);
    }

    public static void main(String[] args) {
        AuthKeyGenerator authKeyGenerator = AuthKeyGenerator.builder()
                .timestamp(System.currentTimeMillis())
                .rand(LiveConstants.DEFAULT_RAND)
                .uid(LiveConstants.DEFAULT_UID)
                .md5hash("md5hash")
                .build();
        System.out.println(authKeyGenerator.gen());
    }

}
